<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------
namespace app\websocket;

use Swoole\Table as SwooleTable;
use think\swoole\Table;

/**
 * Class：房间管理
 * 创建人：Jack
 * 创建时间：2024/1/11 11:00
 * @package app\websocket
 */
class Room
{
    /**
     * 类型 只有kefu和admin有区别
     * @var string
     */
    protected $type = '';

    /**
     * fd前缀
     * @var string
     */
    protected $tableFdPrefix = 'ws_fd_';

    /**
     *
     * @var array
     */
    protected $room = [];

    /**
     * @var \Redis
     */
    protected $cache;

    const USER_INFO_FD_PRE = 'socket_user_list';

    const TYPE_NAME = 'socket_user_type';

    /**
     * 注释：设置缓存
     * 创建人：Jack
     * 创建时间：2024/1/11 11:01
     * @param $cache
     * @return $this
     */
    public function setCache($cache)
    {
        $this->cache = $cache;
        return $this;
    }

    /**
     * 注释：设置表
     * 创建人：Jack
     * 创建时间：2024/1/11 11:01
     * @param string $type
     * @return $this
     */
    public function type(string $type)
    {
        $this->type = $type;
        return $this;
    }

    /**
     * 注释：获取表实例
     * 创建人：Jack
     * 创建时间：2024/1/11 11:01
     * @return SwooleTable|null
     */
    public function getTable()
    {
        return app()->make(Table::class)->get('user');
    }

    /**
     * 注释：添加fd
     * 创建人：Jack
     * 创建时间：2024/1/11 11:01
     * @param string $key     fd
     * @param int    $uid     用户uid
     * @param int    $to_uid  当前聊天人的uid
     * @param int    $tourist 是否为游客
     * @return bool
     */
    public function add(string $key, int $uid, int $to_uid = 0, int $tourist = 0)
    {
        $nowkey = $this->tableFdPrefix . $key;
        $data = ['fd' => $key, 'type' => $this->type ?: 'user', 'uid' => $uid, 'to_uid' => $to_uid, 'tourist' => $tourist];
        $res = $this->getTable()->set($nowkey, $data);
        return $res;
    }

    /**
     * 注释：修改数据
     * 创建人：Jack
     * 创建时间：2024/1/11 11:01
     * @param string $key
     * @param        $field
     * @param        $value
     * @return bool
     */
    public function update(string $key, $field = null, $value = null)
    {
        $nowkey = $this->tableFdPrefix . $key;
        $res = true;
        if (is_array($field)) {
            $res = $this->getTable()->set($nowkey, $field);
        } else if (!is_array($field) && $value !== null) {
            $data = $this->getTable()->get($nowkey);
            if (!$data) {
                return false;
            }
            $data[$field] = $value;
            $res = $this->getTable()->set($nowkey, $data);
        }
        return $res;
    }

    /**
     * 注释：重置
     * 创建人：Jack
     * 创建时间：2024/1/11 11:02
     * @return $this
     */
    public function reset()
    {
        $this->type = $this->typeReset;
        return $this;
    }

    /**
     * 注释：删除
     * 创建人：Jack
     * 创建时间：2024/1/11 11:02
     * @param string $key
     * @return bool
     */
    public function delete(string $key)
    {
        $nowkey = $this->tableFdPrefix . $key;
        return $this->getTable()->del($nowkey);
    }

    /**
     * 注释：是否存在
     * 创建人：Jack
     * 创建时间：2024/1/11 11:03
     * @param string $key
     * @return bool
     */
    public function exist(string $key)
    {
        return $this->getTable()->exist($this->tableFdPrefix . $key);
    }

    /**
     * 注释：获取fd的所有信息
     * 创建人：Jack
     * 创建时间：2024/1/11 11:03
     * @param string      $key
     * @param string|null $field
     * @return mixed
     */
    public function get(string $key, string $field = null)
    {
        return $this->getTable()->get($this->tableFdPrefix . $key, $field);
    }

    /**
     * 注释：fd 获取 uid
     * 创建人：Jack
     * 创建时间：2024/1/11 11:03
     * @param $key
     * @return mixed
     */
    public function fdByUid($key)
    {
        return $this->getTable()->get($this->tableFdPrefix . $key, 'uid');
    }

}